package view;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingUtilities;

import common.Contexto;
import controller.ConjuntoController;
import model.Conjunto;
import model.Prenda;


@SuppressWarnings("serial")
public class ConjuntoPanel extends JPanel {

	private JButton guardarB, eliminarB, volverB;
	private JLabel codigoL, nombreL, cantidadStockL,descuentoL, prendasL;
	private JScrollPane prendasSP;
	private JSpinner cantidadStockS, descuentoS;
	private JTable prendasT;
	private JTextField codigoT, nombreT;
	private PrendasTableModel tableModel;
	private Conjunto conjunto;
	private boolean update = false;
	
	public ConjuntoPanel(List<Prenda> prendas) {
		this.tableModel = new PrendasTableModel(prendas);
		initGui();
		layoutComponents();
		initActions();
	}

	public ConjuntoPanel(List<Prenda> prendas, Conjunto conjunto) {
		this(prendas);
		setConjunto(conjunto);
	}

	private void initGui() {
		codigoL = new JLabel("* Codigo");
		nombreL = new JLabel("* Nombre");
		descuentoL = new JLabel("* Descuento");
		cantidadStockL = new JLabel("Cantidad en stock:");
		prendasL = new JLabel("Prendas:");

		cantidadStockS = new JSpinner(new SpinnerNumberModel(1,0,10000,1));
		descuentoS = new JSpinner(new SpinnerNumberModel(1,0,100,1));
		
		
		volverB = new JButton("Volver");
		guardarB = new JButton("Guardar");
		eliminarB = new JButton("Eliminar");
		eliminarB.setVisible(false);
		
		codigoT = new JTextField(10);
		nombreT = new JTextField(10);
		
		prendasT = new JTable(tableModel);
		prendasT.setPreferredScrollableViewportSize(new Dimension(300,200));
		prendasSP = new JScrollPane(prendasT);

	}

	

	private void layoutComponents() {
		this.setLayout(new GridBagLayout());

		GridBagConstraints c = new GridBagConstraints();
		c.gridx = 0;
		c.gridy = 0;
		c.anchor = GridBagConstraints.WEST;
		c.fill = GridBagConstraints.BOTH;
		c.insets = new Insets(0, 2, 2, 4);
		add(codigoL, c);

		c.gridy = GridBagConstraints.RELATIVE;
		add(nombreL, c);
		add(cantidadStockL, c);
		add(descuentoL, c);
		c.ipady = 20;
		add(prendasL, c);

		c.gridx = 1;
		c.gridy = 0;
		c.ipady = 0;
		c.anchor = GridBagConstraints.WEST;
		c.fill = GridBagConstraints.BOTH;
		c.insets = new Insets(0, 2, 2, 4);
		c.ipadx = 100;
		add(codigoT, c);

		c.gridy = GridBagConstraints.RELATIVE;
		add(nombreT, c);
		add(cantidadStockS, c);
		add(descuentoS, c);


		c.gridx = 0;
		c.gridy = 5;
		c.gridwidth = 5;
		c.ipadx = 120;
		c.ipady = 100;
		add(prendasSP, c);
		
		c.gridx = 0;
		c.gridy = 9;
		c.gridwidth = 1;
		c.gridheight = 1;
		c.ipady = 0;
		c.insets = new Insets(20, 0, 20, 0);

		
		add(guardarB, c);
		c.gridx = 1;
		add(eliminarB, c);
		c.gridx = 2;
		add(volverB, c);

	}

	private void initActions() {
		guardarB.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if (validateFields()) {
					boolean guardado = guardarConjunto();
					clearFields();
					SwingUtilities.windowForComponent(ConjuntoPanel.this).dispose();
					if(guardado) {
						notificarMensaje("El conjunto fue guardado con exito");
					} else {
						notificarError("Ocurrio un error, no pudo guardarse el conjunto");
					}
				}
			}
		});
		
		eliminarB.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				int n = JOptionPane.showConfirmDialog(
					    ConjuntoPanel.this,
					    "Esta seguro que desea eliminar el conjunto?",
					    "Alerta",
					    JOptionPane.YES_NO_OPTION);
				if(n == JOptionPane.YES_OPTION) {
					boolean eliminado = eliminarConjunto();
					if(eliminado) {
						notificarMensaje("El conjunto fue eliminado con exito");
					} else {
						notificarError("Ocurrio un error, no pudo eliminarse el conjunto");
					}
					SwingUtilities.windowForComponent(ConjuntoPanel.this).dispose();
				}
			}
		});

		volverB.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				SwingUtilities.windowForComponent(ConjuntoPanel.this).dispose();
				clearFields();
			}
		});
		
	}
	
	private boolean guardarConjunto() {
		boolean result = false;
		String nombre = nombreT.getText();
		String codigo = codigoT.getText();
		int descuento = (Integer) descuentoS.getValue();
		int cantidadStock = (Integer) cantidadStockS.getValue();
		List<Prenda> prendas = tableModel.getPrendasSeleccionadas();

		if(update) {
			result = ConjuntoController.getInstance().modificarConjunto(conjunto.getCodigo(), codigo, nombre, descuento, cantidadStock,  prendas);
		} else {
			result = ConjuntoController.getInstance().altaConjunto(codigo, nombre, descuento, cantidadStock,  prendas);
		}
		
		
		return result;
	}
	
	private boolean eliminarConjunto() {
		boolean result = false;
		result = ConjuntoController.getInstance().bajaConjunto(conjunto.getCodigo());
		
		return result;
	}
	
	public void showPanel() {
		final JFrame mainFrame = new JFrame();
		mainFrame.setTitle("Nuevo Conjunto");
		mainFrame.getContentPane().add(this);
		mainFrame.setPreferredSize(new Dimension(700, 380));
		mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		mainFrame.pack();
		mainFrame.setLocationRelativeTo(null);
		mainFrame.setVisible(true);
	}

	private boolean validateFields() {
		
		String nombreV = nombreT.getText();
		String codigoV = codigoT.getText();

		if (nombreV.length() == 0 || codigoV.length() == 0) {
			notificarError("Por favor complete todos los campos obligatorios marcados con *");
			return false;
		}

		return true;
	}

	private void clearFields() {
		nombreT.setText("");
		codigoT.setText("");
		descuentoS.setValue(1);
		cantidadStockS.setValue(1);
	}
	
	private void notificarMensaje(String mensaje) {
		Contexto.displayFeedbackMessage(ConjuntoPanel.this, mensaje);
	}
	
	private void notificarError(String error) {
		Contexto.displayErrorMessage(ConjuntoPanel.this,error);
	}
	
	public void actualizarPrendas(List<Prenda> prendas) {
		tableModel.setPrendas(prendas);
	}
	
	private void setConjunto(Conjunto conjunto) {
		this.conjunto = conjunto;
		update = true;
		eliminarB.setVisible(true);
		codigoT.setText(conjunto.getCodigo());
		nombreT.setText(conjunto.getNombre());
		cantidadStockS.setValue(conjunto.getCantidadStock());
		descuentoS.setValue(conjunto.getDescuento());
		
		
		tableModel.setPrendasConjunto(conjunto.getPrendas());
	}

}